home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Format 1995 June
/
MacFormat 25.iso
/
Shareware City
/
Developers
/
OutOfPhase1.1 Source
/
OutOfPhase Folder
/
CheckNameUniqueness.c
< prev
next >
Wrap
Text File
|
1994-08-15
|
8KB
|
258 lines
/* CheckNameUniqueness.c */
/*****************************************************************************/
/* */
/* Out Of Phase: Digital Music Synthesis on General Purpose Computers */
/* Copyright (C) 1994 Thomas R. Lawrence */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* */
/* Thomas R. Lawrence can be reached at tomlaw@world.std.com. */
/* */
/*****************************************************************************/
#include "MiscInfo.h"
#include "Audit.h"
#include "Debug.h"
#include "Definitions.h"
#include "CheckNameUniqueness.h"
#include "MainWindowStuff.h"
#include "Memory.h"
#include "SampleList.h"
#include "AlgoSampList.h"
#include "WaveTableList.h"
#include "AlgoWaveTableList.h"
#include "InstrList.h"
#include "SampleObject.h"
#include "AlgoSampObject.h"
#include "WaveTableObject.h"
#include "AlgoWaveTableObject.h"
#include "InstrObject.h"
#include "Array.h"
#include "DataMunging.h"
#include "Alert.h"
static void CleanUpStringArray(ArrayRec* Array)
{
long Scan;
long Limit;
CheckPtrExistence(Array);
Limit = ArrayGetLength(Array);
for (Scan = 0; Scan < Limit; Scan += 1)
{
ReleasePtr((char*)ArrayGetElement(Array,Scan));
}
DisposeArray(Array);
}
static MyBoolean TestArrays(ArrayRec* Array)
{
long Limit;
long FirstScan;
long SecondScan;
char* Str1;
char* Str2;
CheckPtrExistence(Array);
Limit = ArrayGetLength(Array);
FirstScan = 0;
while (FirstScan < Limit - 1)
{
SecondScan = FirstScan + 1;
while (SecondScan < Limit)
{
Str1 = (char*)ArrayGetElement(Array,FirstScan);
Str2 = (char*)ArrayGetElement(Array,SecondScan);
if (PtrSize(Str1) == PtrSize(Str2))
{
if (MemEqu(Str1,Str2,PtrSize(Str1)))
{
return True; /* found a match */
}
}
SecondScan += 1;
}
FirstScan += 1;
}
return False; /* couldn't find a match */
}
/* this checks all of the objects to make sure that names are unique */
/* it returns True if they are, or returns False and presents a warning dialog */
/* if they aren't unique */
MyBoolean CheckNameUniqueness(struct MainWindowRec* MainWindow)
{
SampleListRec* SampleList;
AlgoSampListRec* AlgoSampList;
WaveTableListRec* WaveTableList;
AlgoWaveTableListRec* AlgoWaveTableList;
InstrListRec* InstrList;
ArrayRec* Array;
long Scan;
long Limit;
char* StringTemp;
MyBoolean Result;
CheckPtrExistence(MainWindow);
SampleList = MainWindowGetSampleList(MainWindow);
CheckPtrExistence(SampleList);
AlgoSampList = MainWindowGetAlgoSampList(MainWindow);
CheckPtrExistence(AlgoSampList);
WaveTableList = MainWindowGetWaveTableList(MainWindow);
CheckPtrExistence(WaveTableList);
AlgoWaveTableList = MainWindowGetAlgoWaveTableList(MainWindow);
CheckPtrExistence(AlgoWaveTableList);
InstrList = MainWindowGetInstrList(MainWindow);
CheckPtrExistence(InstrList);
Array = NewArray();
if (Array == NIL)
{
FailurePointA1:
return True;
}
Limit = SampleListHowMany(SampleList);
for (Scan = 0; Scan < Limit; Scan += 1)
{
StringTemp = SampleObjectGetNameCopy(SampleListGetIndexedSample(SampleList,Scan));
if (StringTemp == NIL)
{
FailurePointA2a:
CleanUpStringArray(Array);
goto FailurePointA1;
}
if (!ArrayAppendElement(Array,StringTemp))
{
FailurePointA2b:
ReleasePtr(StringTemp);
goto FailurePointA2a;
}
}
Limit = AlgoSampListHowMany(AlgoSampList);
for (Scan = 0; Scan < Limit; Scan += 1)
{
StringTemp = AlgoSampObjectGetNameCopy(AlgoSampListGetIndexedAlgoSamp(
AlgoSampList,Scan));
if (StringTemp == NIL)
{
FailurePointA3a:
goto FailurePointA2a;
}
if (!ArrayAppendElement(Array,StringTemp))
{
FailurePointA3b:
ReleasePtr(StringTemp);
goto FailurePointA3a;
}
}
Result = TestArrays(Array);
CleanUpStringArray(Array);
if (Result)
{
AlertHalt("Some samples or algorithmic samples have the same name.",NIL);
return False; /* found a match */
}
Array = NewArray();
if (Array == NIL)
{
FailurePointB1:
return True;
}
Limit = WaveTableListHowMany(WaveTableList);
for (Scan = 0; Scan < Limit; Scan += 1)
{
StringTemp = WaveTableObjectGetNameCopy(WaveTableListGetIndexedWaveTable(
WaveTableList,Scan));
if (StringTemp == NIL)
{
FailurePointB2a:
CleanUpStringArray(Array);
goto FailurePointB1;
}
if (!ArrayAppendElement(Array,StringTemp))
{
FailurePointB2b:
ReleasePtr(StringTemp);
goto FailurePointB2a;
}
}
Limit = AlgoWaveTableListHowMany(AlgoWaveTableList);
for (Scan = 0; Scan < Limit; Scan += 1)
{
StringTemp = AlgoWaveTableObjectGetNameCopy(
AlgoWaveTableListGetIndexedAlgoWaveTable(AlgoWaveTableList,Scan));
if (StringTemp == NIL)
{
FailurePointB3a:
goto FailurePointB2a;
}
if (!ArrayAppendElement(Array,StringTemp))
{
FailurePointB3b:
ReleasePtr(StringTemp);
goto FailurePointB3a;
}
}
Result = TestArrays(Array);
CleanUpStringArray(Array);
if (Result)
{
AlertHalt("Some wave tables or algorithmic wave tables have the same name.",NIL);
return False; /* found a match */
}
Array = NewArray();
if (Array == NIL)
{
FailurePointC1:
return True;
}
Limit = InstrListHowMany(InstrList);
for (Scan = 0; Scan < Limit; Scan += 1)
{
StringTemp = InstrObjectGetNameCopy(InstrListGetIndexedInstr(
InstrList,Scan));
if (StringTemp == NIL)
{
FailurePointC2a:
CleanUpStringArray(Array);
goto FailurePointC1;
}
if (!ArrayAppendElement(Array,StringTemp))
{
FailurePointC2b:
ReleasePtr(StringTemp);
goto FailurePointC2a;
}
}
Result = TestArrays(Array);
CleanUpStringArray(Array);
if (Result)
{
AlertHalt("Some instruments have the same name.",NIL);
return False; /* found a match */
}
return True; /* everything's ok */
}